#ifndef __SWEI_CONFIG_H
#define __SWEI_CONFIG_H


#include <stdbool.h>
#include <stdint.h>


#ifdef __cplusplus
extern "C" {
#endif


#define URL_MAX_LEN (128 - 1)
#define VALID_FILA_VAL (0x12345678) // 有效标志位为这个值说明文件正常

// 自定义开关下载结构体
typedef struct
{
    uint8_t status; // 0：音效1 / 1：音效2 / 2 自定义
    char url[URL_MAX_LEN];
} download_addr;

// 陀螺仪检测相关参数
typedef struct
{
    uint32_t tilt_acc;    // 倾斜检测的加速度阈值
    uint8_t tilt_time;  // 倾斜检测的防抖时间
    //uint8_t tilt_angle; // 倾斜检测的角度阈值
    uint8_t tilt_gyro;  // 倾斜检测的角速度阈值
    uint8_t tilt_val;   // 倾斜检测速度阈值

    uint32_t over_acc;    // 翻转检测的加速度阈值
    uint8_t over_time;  // 翻转检测的防抖时间
    //uint8_t over_angle; // 翻转检测的角度阈值
    uint8_t over_gyro;  // 翻转检测的角速度阈值
    uint8_t over_val;   // 翻转检测速度阈值

    uint16_t unusual_move_check_time; // 异动检测的时间间隔
    uint16_t tremos_check_time;       // 震动检测的时间间隔
} gsensor_manager_st;

// 陀螺仪配置相关参数
typedef struct
{
    uint8_t interrupt_threshold; // 低功耗中断阈值
    uint8_t measure_range;       // 测量范围
    uint8_t sample_frequecy;     // 采样分辨率
    uint8_t reading_count;       // 每次读数据的次数
    uint16_t thread_interval;    // 主线程执行间隔
} gsensor_driver_st;



typedef enum
{
    EN_COLLIDE_EVENT_SENSITIVITY_HIGH         = 20,  /*高灵敏度*/
    EN_COLLIDE_EVENT_SENSITIVITY_MIDDLE       = 80, /*中灵敏度*/
    EN_COLLIDE_EVENT_SENSITIVITY_LOW          = 250, /*低灵敏度，阈值越高*/
}EN_GSENSOR_SENSITIVITY;

/**
 * @brief 周期上报间隔，仅工作激活状态下有效
 */
typedef struct {
    uint16_t  hbt_rpt_intval; // 心跳间隔
    uint16_t  gps_rpt_intval;  // gps定位时间间隔
    uint16_t  can_rpt_intval;   // can状态信息周期1
    uint16_t  can_rpt_intval2;   // can状态信息周期2
} rpt_intval_st;

typedef struct {
    uint8_t shake_sensitivity;      // 震动灵敏度 0 低 / 1 标准 / 2 高
    uint8_t ble_distance;           // 蓝牙感应距离设置 0 近 / 1 标准 / 2 远
    uint8_t ble_insen_unlock;       // 蓝牙无感解锁 0 关 / 1 开
    uint8_t sound_status;           // 音效开关 0 关 / 1 开
    uint8_t sound_volume;           // 音量设置, 1 - 5 档, 5 为音量最大
    download_addr power_on_sound;         // 开机音效设置 0：音效1 / 1：音效2 / 2 自定义
    download_addr power_off_sound;        // 关机音效设置 0：音效1 / 1：音效2 / 2 自定义
    download_addr find_bike_sound;        // 寻车声音设置 0：音效1 / 1：音效2 / 2 自定义
    download_addr ride_abnormal_sound;    // 震动或骑行异常报警音设置 0：音效1 / 1：音效2 / 2 自定义
    uint8_t low_power_sound;        // 电量低提醒设置 0：音效1 / 1：音效2
    uint8_t battery_abnormal_sound; // 电池电控故障声音 0：音效1 / 1：音效2
    uint8_t shift_sound;            // 换挡提示音 0：音效1 / 1：音效2
    uint8_t motor_supersonic_sound; // 电机超速音 0：音效1 / 1：音效2
    uint8_t ble_match_sound;        // 蓝牙绑定成功提示音 0：音效1 / 1：音效2
    download_addr charger_link_sound;     // 充电器连接成功提示音 0：音效1 / 1：音效2 / 2 自定义
    uint8_t buttery2_link_sound;    // 副电池接入成功提示音 0：音效1 / 1：音效2
    uint8_t in_ele_fance_sound;     // 进入电子围栏提示音 0：音效1 / 1：音效2
    uint8_t out_ele_fance_sound;    // 出电子围栏提示音 0：音效1 / 1：音效2
    download_addr christmas_sound;        // 圣诞提示音 1 人声/2 自定义
    download_addr thanksgiving_sound;     // 感恩节提示音 1 人声/2 自定义
    download_addr birthday_sound;         // 生日提示音 1 人声/2 自定义
    download_addr new_year_sound;         // 新年提示音 1 人声/2 自定义
    rpt_intval_st rpt_conf;    // 周期上报参数
} common_config_st;

/* 平台下发的数据的结构体 */
typedef struct
{
    uint32_t            valid_file_flag;        // 文件有效标准
    uint32_t            userId;                 // 关联用户id，激活的时候有，去激活的时候为0
    uint8_t             find_bike;              // 寻车标准位 0:关闭寻车 / 1:寻车
    common_config_st    common;
    gsensor_manager_st  gsensor_manager;
    gsensor_driver_st   gsensor_driver;
    uint8_t             activated;              // 激活状态 0: 未激活 1: 激活
} platform_config_param_st;


/* 配置项枚举值 */
typedef enum{
    TIME_REPORT_IN_NORMAL_MODE = 0x0,
    TIME_REPORT_IN_LOW_POWER_MODE,
    TIME_SEND_CMD_TO_BMS,
    TIME_WAIT_SERVER_ACK,
    TIME_TRY_LOGING_SERVER,
    TIME_TRY_LOGING_SERVER_LONG,
    TIME_SEND_HEARBEAT_NORMAL_MODE, // 心跳间隔
    TIME_SEND_HEARTBEAT_LOW_POWER_MODE,
    TIME_SEND_GENERAL_MSG_NORMAL_MODE,
    TIME_SEND_GENERAL_MSG_LOW_POWER_MODE,
    TIME_SEND_ALARM_INTERVAL,
    TIME_FALT_CODE_ACCUMULATION_TIME,
    TIME_FAULT_DETECTION_TIME,
    TIME_RESTART_GPS,
    TIME_INQUIRE_REG_NETWORK_RESULT,
    TIME_OPEN_CLOSE_FLY_MODE,
    TIME_OPEN_CLOSE_FLY_MODE_LONG,
    TIME_RESTART_TBOX_NO_REG_NETWORK,
    TIME_INQUIRE_REG_NETWORK_STATE_LOW_POWER_MODE,
    TIME_OPEN_CLOSE_FLY_MODE_LOW_POWER_MODE,
    TIME_OPEN_CLOSE_FLY_MODE_LONG_LOW_POWER_MODE,
    TIME_RESTART_TBOX_NO_REG_NETWORK_LOW_POWER_MODE,
    TIME_INQUIRE_GPS_INFO_INTERVAL, // gps定位时间间隔
    TIME_CAN_INFO_UPLOAD_INTERVAL1, // can状态信息周期1
    TIME_CAN_INFO_UPLOAD_INTERVAL2, // can状态信息周期2
    CONFIG_PRODUCTION_TEST_FLAG, // 产线测试标志位
}tbox_config_enum;

// 默认参数
#define HEART_BEAT_DEFAULT_TIME (15) //心跳默认时间15s  
//#define LOCATION_DEFAULT_TIME (2*3600UL)  //定位数据默认上传时间 2小时
#define CAN_INFO_UPLOAD1_DEFAULT_TIME (30) //10s
#define CAN_INFO_UPLOAD2_DEFAULT_TIME (30) //30s

/**
 * @brief report interval config id
 */
typedef enum {
    CONFIG_GPSINFO_INTERVAL   = 1,
    CONFIG_CANINFO_INTERVAL1  = 2,
    CONFIG_CANINFO_INTERVAL2  = 3,
    CONFIG_HEARTBEAT_INTERVAL = 4,
}platform_config_id_e;

/**
 * @description: 初始化
 * @return {*}
 * @Date: 2023-10-17 15:17:10
 * @modification:
 */
int32_t swei_config_init(void);
/**
 * @description: 读取配置参数
 * @return {*}
 * @Date: 2023-10-17 17:34:44
 * @modification:
 */
platform_config_param_st swei_config_get(void);

/**
 * @description: 处理下行配置数据
 * @param {short} cmd_id 指令id
 * @param {uint8_t} *data 数据内容
 * @param {short} data_len 数据长度
 * @return {int32_t}  CMD_SUCCESS: 数据保存成功;  CMD_FAILURE: 数据错误，保存失败;   ACK_UNSUPPORT: 此命令无需修改配置
 * @Date: 2023-10-19 09:12:30
 * @modification:
 */
int32_t swei_config_deal_cmd(uint16_t cmd_id, const uint8_t *data, short data_len);


/**
 * @brief 获取用户ID
 * @return uint32_t 
 */
uint32_t swei_config_get_userid(void);

/**
 * @brief 设置用户ID，绑定时下发调用
 * @param  new_userid       My Param doc
 */
void swei_config_set_userid(uint32_t new_userid);

/**
 * @brief 配置信息打包
 * @param  data             My Param doc
 * @param  data_len         My Param doc
 * @return int32_t 
 */
int32_t swei_packet_config_data(uint8_t *data, uint16_t data_len);

/**
 * @brief 获取单个配置参数
 * @param  set_entry        My Param doc
 * @return uint32_t 
 */
int32_t  swei_adapt_get_config_single_para(uint8_t set_entry);

/**
 * @brief 判断配置上报是否结束
 * @return int32_t 
 */
int32_t swei_config_report_finish(void);

/**
 * @brief 触发上报下一项配置内容
 */
void swei_config_report_trigger_next(void);

/**
 * @brief 重新触发配置上报
 */
void swei_config_report_start(void);

/**
 * @brief 判断设备是否激活
 * @return uint8_t 
 */
uint8_t swei_is_active(void);

/** report interval update/get/set **/

typedef enum{
    REPORT_HEARTBEAT = 0,
    REPORT_GPS,
    REPORT_LBS,
    REPORT_WIFI,
    REPORT_RSRP_SIGNAL,
    REPORT_CAN_INFO_TYPE1,
    REPORT_CAN_INFO_TYPE2,
    REPORT_TBOX_BATT,
    REPORT_TYPE_MAX,
}report_type_intv_t;

typedef struct {
    uint32_t act_normal;  
    uint32_t act_sleep;
    uint32_t inactive_normal;
    uint32_t inactive_sleep;
}rpt_intval_t;

/**
 * @brief 数据发送间隔获取，仅配置工作模式
 * @param  flag   配置类型，心跳/GPS/CAN1/CAN2
 * @return int32_t 
 */
int32_t swei_config_rpt_intval_get(platform_config_id_e flag);

/**
 * @brief 数据发送间隔设置，仅获取工作模式
 * @param  flag             My Param doc
 * @param  sec              My Param doc
 * @return int32_t 
 */
int32_t swei_config_rpt_intval_set(platform_config_id_e flag, uint32_t sec);

/**
 * @brief 数据发送间隔更新，用于获取当前工作模式下发送间隔
 * @param  type             My Param doc
 * @return uint32_t 
 */
uint32_t swei_config_rtp_intval_update(uint8_t type);

/**
 * @brief 设置激活状态
 * @param  act       My Param doc
 * @return int32_t   <= 0 成功, > 0 错误码
 */
int32_t swei_config_set_activated(uint8_t act);

/**
 * @brief 保存平台配置参数
 * @param  param             My Param doc
 * @return int32_t 
 */
int32_t save_platform_config(platform_config_param_st *param);

/**
 * @brief 读取平台配置参数
 * @param  force_default 1强制加载平台默认参数 0读取flash存储参数
 * @return int32_t 
 */
int32_t load_platform_config(char force_default);

#ifdef __cplusplus
}
#endif

#endif // __SWEI_CONFIG_H